package co.edu.uniandes.bi.etl.audi;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Vector;

import co.edu.uniandes.bi.etl.Activity;
import co.edu.uniandes.bi.etl.Row;
import co.edu.uniandes.bi.nlp.AnalysisResult;
import co.edu.uniandes.bi.nlp.EmotionsAnalyzer;

import twitter4j.FilterQuery;
import twitter4j.Status;
import twitter4j.StatusDeletionNotice;
import twitter4j.StatusListener;
import twitter4j.StatusStream;
import twitter4j.TwitterException;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;

public class BusquedaTweets extends Activity{

	private TwitterStream twitterStream;
	private StatusListener statusListener;
	private String nombreCampoBusqueda;
	private Row actualRow;
	
	public BusquedaTweets()
	{
		super();
	}
	
	/**
	 * @return the nombreCampoBusqueda
	 */
	public String getNombreCampoBusqueda() {
		return nombreCampoBusqueda;
	}

	/**
	 * @param nombreCampoBusqueda the nombreCampoBusqueda to set
	 */
	public void setNombreCampoBusqueda(String nombreCampoBusqueda) {
		this.nombreCampoBusqueda = nombreCampoBusqueda;
	}

	public void  ejecutarStreaming()
	{
		statusListener = new StatusListener(){
		        public void onStatus(Status status) {
		        	String nombre = status.getUser().getName();
//		        	String numAmigos = "Numero de amigos: " + status.getUser().getFriendsCount();
//		        	String numSeguidores = "Numero de seguidores: " + status.getUser().getFollowersCount();
		        	String pais = (status.getUser().getLocation() != null ? status.getUser().getLocation() : "SinPais");
//		        	String zonaHoraria = "Zona Horaria : " + status.getUser().getTimeZone();
		        	String tweet = status.getText();
		        	Date fecha = status.getCreatedAt();
		        	SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
		        	String fechaOutput=simpleDateFormat.format(fecha); 
		        	Row outputRow = new Row();
		        	boolean[] valance = analizarTweet(tweet);
		        	
		        	System.out.println(tweet);
		        	
		        	outputRow.setField(Constantes.COL_CONTENIDOEVENTO, tweet);
		        	outputRow.setField(Constantes.COL_FECHA, fechaOutput);
		        	outputRow.setField(Constantes.COL_POSITIVO, valance[0]);
		        	outputRow.setField(Constantes.COL_NEUTRAL, valance[1]);
		        	outputRow.setField(Constantes.COL_NEGATIVO, valance[2]);
		        	outputRow.setField(Constantes.COL_NOMBRE, nombre);
		        	outputRow.setField(Constantes.COL_PAIS, pais);
//		        	outputRow.setField(Constantes.LLAVE_CONTENIDO, actualRow.getField(Constantes.LLAVE_CONTENIDO));
//		        	outputRow.setField(Constantes.LLAVE_CATEGORIA, actualRow.getField(Constantes.LLAVE_CATEGORIA));
		        	output.add(outputRow);
		        }
		        public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) { }
		        public void onTrackLimitationNotice(int numberOfLimitedStatuses) { }
		        public void onScrubGeo(long arg0, long arg1) { }
		        public void onException(Exception ex) {
		            ex.printStackTrace();
		        }
		    };
		    twitterStream =  new TwitterStreamFactory().getInstance();
		    twitterStream.addListener(statusListener);
		    filterQuery();
	}
	
	public boolean[] analizarTweet(String message)
	{
		AnalysisResult analysisResult;
		try {
			analysisResult = EmotionsAnalyzer.analyze(message);
			int valencia=analysisResult.getValence();
			return new boolean[] { valencia > 0, valencia == 0, valencia < 0 };
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public void filterQuery()
	{		
		try 
		{
			for (Row r : input)
			{
				actualRow = r;
				String[] keywords=new String[1];
				keywords[0]=(String) r.getField(nombreCampoBusqueda);
				FilterQuery filterQuery=new FilterQuery();
				filterQuery.track(keywords);
				StatusStream statusStream = twitterStream.getFilterStream(filterQuery);
				for (int i = 0; i <2; i++)
				{
					statusStream.next(statusListener);
				}
				statusStream.close();
			}
		} catch (TwitterException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		BusquedaTweets pruebaStreaming=new BusquedaTweets();
		List<Row> terminosBusqueda=new Vector<Row>();
		Row r = new Row();
		r.setField("URL", "audi");
		terminosBusqueda.add(r);
		pruebaStreaming.setInput(terminosBusqueda);
		pruebaStreaming.ejecutarStreaming();
	}

	@Override
	public void execute() {
		ejecutarStreaming();
		executeNext();
	}

}
